/**
 * Creado el 18-nov-2004
 * 
 * @author Jorge Mejuto
 * 
 *         Descripci�n: Clase encargada de acceder y realizar miner�a en una hoja de Excel.
 */

package net.eyra.utiles;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.text.SimpleDateFormat;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;

public class HojaXLS {

    FileInputStream fichero = null;

    /**
     * 
     * @uml.property name="ficheroExcel" multiplicity="(0 1)"
     */
    private String ficheroExcel = null;

    /**
     * 
     * @uml.property name="fs"
     * @uml.associationEnd multiplicity="(0 1)"
     */
    private POIFSFileSystem fs = null;

    /**
     * 
     * @uml.property name="wb"
     * @uml.associationEnd multiplicity="(0 1)"
     */
    private HSSFWorkbook wb = null;

    /**
     * 
     * @uml.property name="sheet"
     * @uml.associationEnd multiplicity="(0 1)"
     */
    private HSSFSheet sheet = null;

    /**
     * 
     * @uml.property name="row"
     * @uml.associationEnd multiplicity="(0 1)"
     */
    private HSSFRow row = null;

    /**
     * 
     * @uml.property name="cell"
     * @uml.associationEnd multiplicity="(0 1)"
     */
    // private HSSFCell cell = null;

    /**
     * Constructor por defecto.
     */
    public HojaXLS() {
    }

    /**
     * @param ficheroExcel
     *            Ruta completa del fichero Excel que se quiere procesar.
     */
    public HojaXLS(String ficheroExcel) {
        this.setFicheroExcel(ficheroExcel);
    }

    /**
     * Carga el fichero que contiene la Excel, y crea un objeto LibroExcel.
     * 
     * @throws Exception
     *             Si se producen errores en la carga o localizaci�n del fichero.
     */
    public void CargarFicheroXLS() throws FicheroException {
        try {
            if (ficheroExcel != null) {
                fichero = new FileInputStream(new File(ficheroExcel));
                fs = new POIFSFileSystem(fichero);
                wb = new HSSFWorkbook(fs);
            } else throw new FicheroException("No se encuentra el fichero '" + ficheroExcel + "'.");
        } catch (FileNotFoundException e) {
            throw new FicheroException("No se encuentra el fichero '" + ficheroExcel + "'.");
        } catch (IOException e) {
            throw new FicheroException("Error al intentar cargar el fichero '" + ficheroExcel + "'.");
        }
    }

    /**
     * Carga una Hoja del Libro de una Excel que ser� en el que se aplicar�n los m�todos de miner�a.
     * 
     * @param numeroHoja
     *            N�mero de la Hoja dentro del Libro de una Excel. Se comienza a contar desde cero.
     */
    public void CargarHoja(int numeroHoja) {
        sheet = wb.getSheetAt(numeroHoja);
    }

    /**
     * Carga una l�nea completa de una Hoja de Excel.
     * 
     * @param numeroLinea
     *            N�mero de l�nea a cargar. Se comienza a contar desde cero.
     */
    public void CargarLinea(int numeroLinea) {
        row = sheet.getRow(numeroLinea);
    }

    public void CerrarExcel() throws IOException {
        fichero.close();
    }

    /**
     * Comprueba si el contenido de una celda es num�rico.
     * 
     * @param numeroColumna
     *            N�mero de la columna de la celda que queremos comprobar. Una celda el la intersecci�n de una fila por una columna. Las columnas se
     *            comienzan a numerar desde cero.
     * @return true si es num�rica, false en cualquier otro caso.
     */
    public boolean esNumerica(int numeroColumna) {
        try {
            if (row.getCell(numeroColumna).getCellType() == HSSFCell.CELL_TYPE_NUMERIC) return true;
            return false;
        } catch (Exception e) {
            return false;
        }
    }

    /**
     * 
     * @uml.property name="ficheroExcel"
     */
    public String getFicheroExcel() {
        return this.ficheroExcel;
    }

    public HSSFWorkbook getLibro() {
        return wb;
    }

    public String getNombreHoja(int numeroHoja) {
        return wb.getSheetName(numeroHoja);
    }

    public int getNumeroColumnas() {
        return row.getPhysicalNumberOfCells();
    }

    public int getNumeroFilas() {
        return sheet.getPhysicalNumberOfRows();
    }

    public int getNumeroHojas() {
        return wb.getNumberOfSheets();
    }

    public int getTipoCelda(int numeroColumna) {
        return row.getCell(numeroColumna).getCellType();
    }

    /**
     * 
     * @param numeroColumna
     *            N�mero de la columna de la celda que queremos comprobar. Una celda el la intersecci�n de una fila por una columna. Las columnas se
     *            comienzan a numerar desde cero.
     * @return Devuelve el contenido de una celda que contenga fechas. Si el contenido no es texto, devolver� null.
     */
    public String getValorFechaCelda(int numeroColumna) {
        try {
            SimpleDateFormat ifecha = new SimpleDateFormat("dd/MM/yyyy");
            return ifecha.format(row.getCell(numeroColumna).getDateCellValue()).toString();
        } catch (Exception e) {
            return row.getCell(numeroColumna).getStringCellValue();
        }
    }

    /**
     * 
     * @param numeroColumna
     *            N�mero de la columna de la celda que queremos comprobar. Una celda el la intersecci�n de una fila por una columna. Las columnas se
     *            comienzan a numerar desde cero.
     * @return Devuelve el contenido de una celda que contenga horas. Si el contenido no es texto, devolver� null.
     */
    public String getValorHoraCelda(int numeroColumna) {
        try {
            return row.getCell(numeroColumna).getStringCellValue();
        } catch (Exception e) {
            return null;
        }
    }

    /**
     * 
     * @param numeroColumna
     *            N�mero de la columna de la celda que queremos comprobar. Una celda el la intersecci�n de una fila por una columna. Las columnas se
     *            comienzan a numerar desde cero.
     * @return Devuelve el contenido de una celda que contenga n�meros. Si el contenido no es num�rico, devolver� null.
     */
    public Double getValorNumeroCelda(int numeroColumna) {
        try {
            return new Double(row.getCell(numeroColumna).getNumericCellValue());
        } catch (Exception e) {
            return null;
        }
    }

    /**
     * 
     * @param numeroColumna
     *            N�mero de la columna de la celda que queremos comprobar. Una celda el la intersecci�n de una fila por una columna. Las columnas se
     *            comienzan a numerar desde cero.
     * @return Devuelve el contenido de una celda que contenga texto. Si el contenido no es texto, devolver� null.
     */
    public String getValorTextoCelda(int numeroColumna) {
        try {
            return row.getCell(numeroColumna).getStringCellValue();
        } catch (Exception e) {
            return null;
        }
    }

    /**
     * 
     * @uml.property name="ficheroExcel"
     */
    public void setFicheroExcel(String ficheroExcel) {
        this.ficheroExcel = ficheroExcel;
    }

    public void setLibro(HSSFWorkbook wb) {
        this.wb = wb;
    }
}